//权限拦截在路由跳转  导航守卫
import router from '@/router'
import store from '@/store'  //引入store实例  和组件中的this.$store是一回事
import nprogress from 'nprogress'  //引入进度条
import 'nprogress/nprogress.css'  //引入进度条样式

//不需要导出  因为只需要让代码执行即可
//前置守卫  
//next是前置守卫必须必须必须执行的钩子  next必须执行  如果不执行  页面就死了
//next()  放过
//next(false) 跳转终止
//next(地址)  跳转到某个地址
const whiteList = ['/login', '/404']//定义白名单  不受token的控制影响
router.beforeEach(async (to, from, next) => {
    nprogress.start()//开启进度条
    //前置守卫
    if (store.getters.token) {//因为登录时在getters里面设置了token快捷访问方式
        //如果有token
        if (to.path === "/login") {
            //如果访问的是login登录页
            next("/")//则跳到主页    //有token  用处理码?不用
        } else {
            //只有放过的时候才获取用户资料
            //是每次都获取么?
            //如果当前vuex中有用户的资料的id  表示已经有资料了 不需要获取了  如果没有id才需要获取
            if (!store.state.user.userInfo.userId) {
                //如果没有id才表示当前用户资料没有获取过
                await store.dispatch('user/getUserInfo')
                //如果说后续  需要根据用户资料获取数据的话  这里必须改成 同步
            }
            next()  //有token不是登录页则放过
        }
    } else {
        //如果说没有token
        //判断是否是白名单
        if (whiteList.indexOf(to.path) > -1) {
            //表示要去的地址在白名单
            next()//放行
        } else {
            //不在白名单中
            next("/login")//跳转到登录页
            // next()
        }
    }
    nprogress.done()//关闭进度条  解决手动切换地址时，  进度条不关闭问题
})

//后置守卫
router.afterEach(() => {
    nprogress.done()//关闭进度条
})